ポリシーの Principal と NotPrincipal で同じ書き方をしても対象が異なるもの
はじめに
こんにちは、パオの人ことさすけです!
今回はポリシーの記述方法に関する仕様のお話です。Principal と NotPrincipal では少し仕様が異なる部分がありましたので、メモ感覚で書き残しておきます。
Principal と NotPrincipal
まずは簡単に Principal と NotPrincipal で何ができるのかについて見ていきましょう。
たとえば Principal では、以下のバケットポリシーのような書き方をした場合「User1
と Role1
に対して、test
バケット内のオブジェクトに対する全 S3 アクション権限を付与する」という内容になります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowTestAccess",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::xxxxxxxxxxxx:user/User1",
"arn:aws:iam::xxxxxxxxxxxx:role/Role1"
]
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::test/*"
}
]
}
Principal を下記バケットポリシーのように NotPrincipal に変更して見ましょう。
すると「User1
と Role1
以外 に対して、test
バケット内のオブジェクトに対する全 S3 アクション権限を付与する」といった内容になります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowTestAccess",
"Effect": "Allow",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::xxxxxxxxxxxx:user/User1",
"arn:aws:iam::xxxxxxxxxxxx:role/Role1"
]
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::test/*"
}
]
}
arn:aws:iam::xxxxxxxxxxxx:root の扱いについて
さて、ここからが本題です。
まずは皆さんの印象のままで良いので、少し以下 2 つのバケットポリシーについてどのような権限になっているか考えてみてください!
Principal の場合
1 つ目は、Principal の場合です。
全文としては下記の通りになりますが、皆さんはこのポリシーは誰に対して全 S3 アクション許可していると思いますか??
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowTestAccess",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::xxxxxxxxxxxx:root"
]
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::test/*"
}
]
}
正解は アカウント ID(xxxxxxxxxxxx)配下の全ユーザーおよび全ロール です!
意外ですよね、、自分も最初はルートユーザーを指すと思っていたので、初めて調べた時は驚きました。
たとえば上記ポリシーであれば、当該アカウント ID からであれば、どのユーザーどのロールを使用しても test
バケット内のオブジェクトに対して、全 S3 アクションが許可されるということですね。
NotPrincipal の場合
では、2 つ目に下記のように NotPrincipal の場合、誰が対象になるのでしょうか?
こちらも少し考えてみてください!
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowTestAccess",
"Effect": "Allow",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::xxxxxxxxxxxx:root"
]
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::test/*"
}
]
}
正解は、ルートユーザー をです!
NotPrincipal の場合は、直感的というか想像通りな感じですね。
つまり上記ポリシーでは、ルートユーザーに対してのみ test
バケット内のオブジェクトに対して全 S3 アクションを許可しているということになります。
まとめ
今回は Principal と NotPrincipal では、arn:aws:iam::xxxxxxxxxxxx:root
と記述したときの対象ユーザーおよびロールが異なるという話をしました。
この仕様は、割と知らない方もいるかと思いますので、ぜひ覚えておいてください!「ルートユーザーを指定したつもりなのにできていなかった」なんてことになっては大変ですから、、。
参考文献
- AWS JSON ポリシーの要素: Principal - AWS Identity and Access Management
- AWS JSON ポリシーの要素: NotPrincipal - AWS Identity and Access Management
アノテーション株式会社
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。